package org.colswe.testingProject.entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

/**
 * Esta clase entidad es usada para almacenar la información correspondiente a
 * las solicitudes.
 *
 * @author Leonardo Bohórquez
 */
@Entity
public class Application implements Serializable {

    /**
     * Constante 27.
     */
    private static final int DOS7 = 27;
    /**
     * Constante 12.
     */
    private static final int UNO2 = 12;
    /**
     * Constante 200.
     */
    private static final int DOS00 = 200;
    /**
     * Constante 6.
     */
    private static final int SEIS = 6;
    /**
     * Constante false.
     */
    private static final boolean FALSE = false;
    /**
     * Constante true.
     */
    private static final boolean TRUE = true;
    /**
     * Id de la solicitud.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    /**
     * Instancia en la que se encuentra la solicitud.
     */
    @Column(length = DOS7, nullable = FALSE)
    private String instance;
    /**
     * Decisión tomada sobre la solicitud.
     */
    @Column(length = UNO2, nullable = TRUE)
    private String decision;
    /**
     * Observaciones sobre la documentación entregada.
     */
    @Column(length = DOS00, nullable = FALSE)
    private String suportDocuments;
    /**
     * Periodo de la solicitud.
     */
    @Column(length = SEIS, nullable = FALSE)
    private String periodApplication;
    /**
     * Fecha última modificación de la solicitud.
     */
    @Temporal(TemporalType.DATE)
    private Date dateLastChange;
    /**
     * Tipo de la solicitud.
     */
    @OneToOne
    @JoinColumn(nullable = FALSE)
    private ApplicationType type;
    /**
     * Estudiante que presenta la solicitud.
     */
    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(nullable = FALSE)
    private Student student;

    /**
     * Construtor por defecto de la clase Application.
     */
    public Application() {
    }

    /**
     * Costructor que recibe los parámetros para inicializar la clase
     * Application.
     *
     * @param instance Cadena que representa la instancia en la que se encuentra
     * la solicitud.
     * @param decision Cadena que representa la decisión sobre la solicitud.
     * @param suportDocuments Cadena que contienen una lista de documentos
     * físicos entregados para la solicitud.
     * @param periodApplication Cadena que contiene el periodo en que se
     * presentó la solicitud.
     * @param dateLastChange Fecha que contiene la fecha del último cambio hecho
     * a la solicitud.
     * @param type Tipo de solicitud.
     * @param student Estudiante que hace la solicitud.
     */
    public Application(String instance, String decision, String suportDocuments,
            String periodApplication, Date dateLastChange,
            ApplicationType type, Student student) {
        this.instance = instance;
        this.decision = decision;
        this.suportDocuments = suportDocuments;
        this.periodApplication = periodApplication;
        this.dateLastChange = dateLastChange;
        this.type = type;
        this.student = student;
    }

    /**
     * Función para conseguir la última fecha en que se le hizo un cambio a la
     * colicitud.
     *
     * @return Fecha del último cambio.
     */
    public Date getDateLastChange() {
        return dateLastChange;
    }

    /**
     * Este método permite establecer la fecha del último cambio hecho a la
     * solicitud.
     *
     * @param dateLastChange Fecha del último cambio que va a tener la
     * solicitud.
     */
    public void setDateLastChange(Date dateLastChange) {
        this.dateLastChange = dateLastChange;
    }

    /**
     * Función para conseguir la decisión que tiene la solicitud.
     *
     * @return Decisión sobre la solicitud.
     */
    public String getDecision() {
        return decision;
    }

    /**
     * Este método permite establecer la decisión sobre la solicitud.
     *
     * @param decision Decisión tomada sobre la solicitud.
     */
    public void setDecision(String decision) {
        this.decision = decision;
    }

    /**
     * Función para conseguir el Id de la solicitud.
     *
     * @return Id de la solicitud.
     */
    public Long getId() {
        return id;
    }

    /**
     * Este método permite establecer el id de la solicitud.
     *
     * @param id Id de la solicitud.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Función para conseguir la instancia en la que se encuentra la solicitud.
     *
     * @return Instancia en la que se encuentra la solicitud.
     */
    public String getInstance() {
        return instance;
    }

    /**
     * Este método permite establecer la instancia en la que se encuentra la
     * solicitud.
     *
     * @param instance Instancia en la que se encuentra la solicitud.
     */
    public void setInstance(String instance) {
        this.instance = instance;
    }

    /**
     * Función que permite obtener el periodo en que se presentó la solicitud.
     *
     * @return Periodo en el que se presentó la solicitud.
     */
    public String getPeriodApplication() {
        return periodApplication;
    }

    /**
     * Este método permite establecer el periodo en que se presentó la
     * solicitud.
     *
     * @param periodApplication Periodo en el que se presentó la instancia.
     */
    public void setPeriodApplication(String periodApplication) {
        this.periodApplication = periodApplication;
    }

    /**
     * Función para obtener la cadena con los documentos entregados en el
     * momento de la radicación de la solicitud.
     *
     * @return Documentos entregados al momento de hacer la radicación.
     */
    public String getSuportDocuments() {
        return suportDocuments;
    }

    /**
     * Este método permite establecer los documentos entregados en el momento en
     * que se radicó la solicitud.
     *
     * @param suportDocuments Documentos que se entregaron al momento de radicar
     * la solicitud.
     */
    public void setSuportDocuments(String suportDocuments) {
        this.suportDocuments = suportDocuments;
    }

    /**
     * Función que permite obtener el tipo de solicitud.
     *
     * @return Tipo de solicitud.
     */
    public ApplicationType getType() {
        return type;
    }

    /**
     * Este método permite establecer el tipo de solicitud.
     *
     * @param type Tipo de solicitud.
     */
    public void setType(ApplicationType type) {
        this.type = type;
    }

    /**
     * Función para obtener el estudiante que presenta la solicitud.
     *
     * @return Estduiante que presentó la solicitud.
     */
    public Student getStudent() {
        return student;
    }

    /**
     * Este método permite establecer el estudiante que presenta la solicitud.
     *
     * @param student Estudiante que presenta la solicitud.
     */
    public void setStudent(Student student) {
        this.student = student;
    }
}
